# Installer pakkene hvis nødvendig (første gang)
# install.packages(c("readr","dplyr","tidyr","stringr","vroom","ggplot2","scales","tidyverse", "plotly"))
library(readr)
library(dplyr)
library(tidyr)
library(stringr)
library(vroom)
library(ggplot2)
library(scales)SOK-2302 Seminar - Forurensing — Empirisk oppgave
Introduksjon
I denne oppgaven skal vi se på utslippsrettigheter i EU ETS og utslipp av klimagass i Europeiske land.
Data
Du finner data til oppgaven på European Environmental Agency sin hjemmeside: EEA hjemmeside
Du finner data knyttet til handel med utslippsrettigheter blant annet under “datahub”, direktlenke her: EEA Datahub
Last ned “dataviewer_data_july25.csv”
Datamaterialet innholder informasjon om “Total allocated allowances (EUA or EUAA)” og “Verified emissions”. “Free allowances” er de utslippsrettigheter som blir delt ut gratis innen EU ETS. “Verified emissions” er de faktiske utslipp som skjer i et år. Dersom et land (eller sektor) har høyere utslipp enn de får tildelt utslippsrettigheter må landet (sektoren) kjøpe utslippsrettigheter på markedet. I oppgavene skal vi se på hvordan utviklingen i utslipp og tildelte utslippsrettigheter har utviklet seg i EU totalt, nordiske land, og i Norge over tid.
Datamaterialet er stort og jeg fikk problemer når jeg prøvde å laste det inn i R-studioen. Koden under, som jeg har lagd til dels med hjelp fra ChatGPT5.0, viser hvordan du kan bruke pakken “vroom” til å laste inn deler av datamaterialet. Koden lager et datasett med alle variabler som trengs til oppgavene.
setwd("C:/Users/ama123/OneDrive - UiT Office 365/Data/Undervisning/sok_2032_necon/")
ets_all_raw <- vroom(
"dataviewer_data_july25.csv",
col_select = c("country","ETS information", "main activity sector name", "unit", "value", "year")
)%>%
rename(ETS_information = `ETS information`,
sector = 'main activity sector name')Det ferdige datamaterialet skal innholde 6 variabler: “country” = land, “ETS_information” = type ETS informasjon, “sektor” = sektor der utslippene skjer, “unit” = måle-enhet, “value” = verdi på variabelen, og “year” = år.
Oppgave 1
I denne oppgaven skal vi lage en graf som visualiserer de nordiske landenes “handel” med utslippsrettigheter innen EU ETS. Målet er å lage en graf som viser om landene hadde flere utslippsrettigheter enn de hadde behov for et år, eller om de hadde behov for å kjøpe utslippsrettigheter på markedet. Grafen vil ikke gi et helt korrekt bilde da det er mulig å “spare” utslippsrettigheter over tid.
Lag en dataframe med informasjon om “1.1 Freely allocated allowances” og “2. Verified emissions” for Norge, Finland, Sverige og Danmark. “1.1 Freely allocated allowances” inneholder informasjon om hvor mange utslippsrettigheter som bedrifter i landene får gratis tildelt. “2. Verified emissions” gir informasjon om faktiske uslipp. Velg sektoren “20-99 All stationary installations” for å få aggregert informasjon om alle sektorer i hvert land.
Beregn nettot av “1.1 Freely allocated allowances” og “2. Verified emissions” for hvert land og år. NB: for å gjøre dette må du omstrukturere data slik at “1.1 Freely allocated allowances” og “2. Verified emissions” er to ulike variabler på samme rad for et land og år.
Lag en graf som viser nettot i de ulike landene for de årene som er tilgjengelige i datamaterialet.
Tolke grafen i forhold til handel med utslippsrettigheter. Hvem har behov for å kjøpe og selge utslippsrettigheter? Er det noen land som ser ut å ha større behov? Ser det ut å være noen trender i handelen?
nordic_countries <- c("Finland", "Norway", "Denmark", "Sweden")
years <- c("2013", "2014", "2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023", "2024")
allowances_emissions <- c("1.1 Freely allocated allowances", "2. Verified emissions")
all_sectors <- c("20-99 All stationary installations")
country_order <- c("Denmark", "Finland", "Norway", "Sweden")
ets_nordic <- ets_all_raw %>%
filter(country %in% nordic_countries)%>%
filter(ETS_information %in% allowances_emissions)%>%
filter(year %in% years)%>%
filter(sector %in% all_sectors)
#head(ets_nordic)
# Dataframe med nettot av gratis utslippsrettigheter og utslipp i de nordiske landene
ets_balance <- ets_nordic %>%
# Behold de variabler vi trenger
select(country, ETS_information, value, year) %>%
# Reshape so that emissions and allowances are in separate columns
tidyr::pivot_wider(
names_from = ETS_information,
values_from = value
) %>%
# Gi nye navn for enklere bruk seinere
rename(
emissions = `2. Verified emissions`,
free_allowances = `1.1 Freely allocated allowances`
) %>%
# Beregn netto
mutate(
trade_balance = free_allowances - emissions
)Bar plot
country_order <- c("Denmark", "Finland", "Norway", "Sweden")
# PLOT
plot_trade <- ggplot(ets_balance, aes(x = year, y = trade_balance, fill = country)) +
geom_col(position = "dodge") + # Create side-by-side bars
labs(
x = "År",
y = " Salg av utslippsrettigheter (kilo ton CO2-ekv) ",
title = "Handel med utslippsrettigheter"
) +
scale_fill_manual(
values = c("Denmark" = "hotpink", "Finland" = "violetred", "Norway" = "darkmagenta",
"Sweden" = "blueviolet"),
breaks = country_order, # Ensure legend matches the factor_levels
labels = country_order, # Ensure labels match the factor_levels
guide = guide_legend(title = NULL) # Remove legend title
) +
scale_y_continuous(labels = comma) + # avoid scientific notation
theme_minimal()
print(plot_trade)Line plot
# PLOT
plot_trade_line <- ggplot(ets_balance, aes(x = year, y = trade_balance, color = country, group = country)) +
geom_line(size = 1) + # line for each country
geom_point(size = 2) + # add points for each year
labs(
x = "År",
y = "Salg av utslippsrettigheter (kilo ton CO2-ekv)",
title = "Handel med utslippsrettigheter"
) +
scale_color_manual(
values = c("Denmark" = "hotpink", "Finland" = "violetred", "Norway" = "darkmagenta",
"Sweden" = "blueviolet"),
breaks = country_order,
labels = country_order,
guide = guide_legend(title = NULL)
) +
geom_hline(yintercept = 0, linetype = "dashed", color = "black") + # line at zero
scale_y_continuous(labels = comma) + # avoid scientific notation
theme_minimal()
print(plot_trade_line)Interaktiv plot
library(ggplot2)
library(plotly)
library(htmlwidgets)
library(scales)
country_order <- c("Denmark","Finland","Norway","Sweden")
p <- ggplot(ets_balance %>% filter(country %in% country_order),
aes(x = as.numeric(year), y = trade_balance, color = country, group = country,
text = paste0("Country: ", country, "<br>",
"Year: ", year, "<br>",
"Trade (kton): ", scales::comma(round(trade_balance/1000,2))))
) +
geom_line(size = 1) +
geom_point(size = 4, alpha = 0.8) +
geom_hline(yintercept = 0, linetype = "dashed", color = "black") +
scale_color_manual(values = c("Denmark" = "hotpink", "Finland" = "violetred",
"Norway" = "darkmagenta", "Sweden" = "blueviolet"),
breaks = country_order) +
labs(x = "År", y = "Salg av utslippsrettigheter (tonn CO2-ekv)",
title = "Handel med utslippsrettigheter") +
scale_y_continuous(labels = comma) +
theme_minimal()
gg <- ggplotly(p, tooltip = "text") %>%
layout(hovermode = "x unified") %>%
config(displayModeBar = TRUE)
# JavaScript: on click add/update vertical line at clicked x coordinate
js <- "
function(el, x) {
var plot = el;
plot.on('plotly_click', function(data) {
if(!data || !data.points || data.points.length === 0) return;
var xval = data.points[0].x;
// create a vertical line as a shape
var vline = {
type: 'line',
x0: xval, x1: xval,
y0: 0, y1: 1,
xref: 'x', yref: 'paper',
line: {color: 'black', width: 1.5, dash: 'dot'}
};
// keep any existing shapes except previous click-line, or replace by id approach:
var shapes = (plot.layout.shapes || []).filter(function(s){ return s.name !== 'click_vline'; });
vline.name = 'click_vline';
shapes.push(vline);
Plotly.relayout(plot, {'shapes': shapes});
});
}
"
# attach the JS
gg <- onRender(gg, js)
ggOppgave 2
I denne oppgaven skal vi se litt nærmere på hvordan utslippene i Norge har utviklet seg i ulike sektorer over tid.
- Lag en dataframe med informasjon for Norge. Velg ut informasjon for alle sektorer i Norge (og fjern “20-99 All stationary installations”).
- Lag en graf som viser utslippene av CO2-ekvivalenter i de ulike sektorene over tid. Tips: bruke “facet_wrap(~sector, scales =”free_y”)” for å lage en graf per sektor og la y-akselen variere mellom grafene.
- Hvordan skal vi tolke disse grafene? Ser du noen fordeler og/eller ulemper med å bruke scales = “free_y” når vi skal tolke grafene?
Norway <- c("Norway")
emissions <- c("2. Verified emissions")
sectors <- c("10 Aviation",
"20 Combustion of fuels",
"21 Refining of mineral oil",
"24 Production of pig iron or steel",
"29 Production of cement clinker",
"31 Manufacture of glass",
"30 Production of lime, or calcination of dolomite/magnesite",
"32 Manufacture of ceramics",
"34 Production or processing of gypsum or plasterboard",
"35 Production of pulp",
"36 Production of paper or cardboard",
"42 Production of bulk chemicals")
ets_norway <- ets_all_raw %>%
filter(country %in% Norway) %>%
filter(ETS_information %in% emissions)%>%
filter(sector%in% sectors )%>%
rename(CO2_ekv = value)%>%
mutate(year = as.numeric(year))%>%
mutate(CO2_ekv = as.numeric(CO2_ekv))%>%
mutate(CO2_ekv_kton = CO2_ekv/1000)%>%
filter(!is.na(year))
plot_nor <- ggplot(ets_norway, aes(x = year, y = CO2_ekv_kton, color = sector, group = sector)) +
facet_wrap(~sector, scales = "free_y") +
geom_line(size = 1) + # Draw lines
geom_point(size = 2) + # Add points for each year
labs(
x = "År",
y = "Kilo ton CO2 ekvivalenter",
title = "Verified Emissions in different sectors in Norway"
) +
theme_minimal() +
theme(
legend.position = "none"
)
print(plot_nor)Interaktiv plot
library(ggplot2)
library(plotly)
library(htmlwidgets)
library(scales)
p <- ggplot(ets_norway,
aes(x = as.numeric(year), y = CO2_ekv_kton, color = sector, group = sector,
text = paste0("Sektor: ", sector, "<br>",
"År: ", year, "<br>",
"Utslipp: ", scales::comma(round(CO2_ekv_kton/1000,2))))
) +
facet_wrap(~sector, scales = "free_y", ncol = 1) + # en kolonne, ulike grafer for hver sektor, fri skala på y-akselen
geom_line(size = 1) +
geom_point(size = 4, alpha = 0.8) +
labs(x = "År", y = "Utslipp av klimagass (tonn CO2-ekv)",
title = "Utslipp av klimagass i ulike sektorer i Norge") +
scale_y_continuous(labels = comma) +
theme_minimal()
# Convert to plotly and increase figure height
gg_sektor <- ggplotly(p, tooltip = "text") %>%
layout(
hovermode = "x unified",
height = 16 * 250 # 250px per facet, adjust as needed
) %>%
config(displayModeBar = TRUE)
# JavaScript: add/update vertical line at clicked x
js <- "
function(el, x) {
var plot = el;
plot.on('plotly_click', function(data) {
if(!data || !data.points || data.points.length === 0) return;
var xval = data.points[0].x;
var vline = {
type: 'line',
x0: xval, x1: xval,
y0: 0, y1: 1,
xref: 'x', yref: 'paper',
line: {color: 'black', width: 1.5, dash: 'dot'}
};
var shapes = (plot.layout.shapes || []).filter(function(s){ return s.name !== 'click_vline'; });
vline.name = 'click_vline';
shapes.push(vline);
Plotly.relayout(plot, {'shapes': shapes});
});
}
"
gg_sektor <- onRender(gg_sektor, js)
gg_sektor